/**
 * @file o_txr_algo_dlm_v5.h
 * @brief 定义o_TxrAlgoDlmV5类的头文件，该类实现对象检测算法。
 *
 * 本文件包含o_TxrAlgoDlmV5类的定义，该类继承自TxrAlgoDlmImpl基类并实现特定的对象检测功能。
 * 它使用Yolo_VINO类进行模型推理，并提供一系列用于加载模型、执行检测和释放资源的方法。
 */

#ifndef O_TXR_ALGO_DLM_V5_H
#define O_TXR_ALGO_DLM_V5_H

#pragma once


#include "../txr_algo_dlm/txr_algo_dlm_impl.h" // 包含基类"txr_algo_dlm_impl.h"，定义了"TxrAlgoDlmImpl"类

#include "model_infer_vino.h"               // 包含"model_infer_ovino.h"头文件，可能定义了与推理模型相关的类或函数
#include "o_txr_algo_dlm_v5_global.h"       // 包含"o_txr_algo_dlm_v5_global.h"头文件，可能定义了全局配置或常量
#include "model_infer_vino.h"  // 包含与YOLOv6模型相关的头文件
#include "common/define.h"  // 包含通用定义的头文件

namespace vino_v6
{
    class Yolo_VINO; // Yolo_VINO类的前向声明，在yolo_v6命名空间中，用于避免重复包含并提供依赖关系
} // namespace yolo_v6

using namespace vino_v6; // 使用yolo_v6命名空间，以便在代码中直接访问yolo_v6的类和函数

namespace txr_algo_dlm
{
    /**
     * @brief 声明最终类o_TxrAlgoDlmV5，继承自TxrAlgoDlmImpl。
     */
    class o_TxrAlgoDlmV5 final : public TxrAlgoDlmImpl
    {
    public:
        /**
         * 构造函数，初始化o_TxrAlgoDlmV5对象。
         */
        o_TxrAlgoDlmV5();

        /**
         * 析构函数，销毁o_TxrAlgoDlmV5对象。
         */
        ~o_TxrAlgoDlmV5() override;

        /**
         * 加载配置文件。
         * @param cfg 配置结构的引用，包含模型文件路径和其他配置信息。
         * @return 返回加载结果，true表示成功，false表示失败。
         */
        tk_bool Load(st_dlm_cfg & cfg) override;

        /**
         * 返回批处理大小。
         * @return 返回批处理大小，如果m_p_detect为空则返回0。
         */
        tk_int32 BatchSize() override;

        /**
         * 对输入的检测单元数组执行对象检测。
         * @param p_unit 指向输入检测单元数组的指针。
         * @param size 输入检测单元的数量。
         */
        void Detect(st_detect_unit * p_unit, tk_int32 size) override;

        /**
         * 释放与检测模型相关的资源。
         */
        void Release();

    private:
        // 检测模型的指针，使用vino_v6::Yolo_VINO实现特定的检测功能
        vino_v6::Yolo_VINO *m_p_detect;
    };

       /**
        * 外部接口声明。
        * 创建并返回一个o_TxrAlgoDlmV5对象。
        * @return 返回一个TxrAlgoDlmImpl类型的指针，指向新创建的o_TxrAlgoDlmV5对象。
        */
       extern "C" O_TXR_ALGO_DLM_V5_EXPORT TxrAlgoDlmImpl* CreateDlmObj();
    
       /**
        * 外部接口声明。
        * 安全删除TxrAlgoDlmImpl类型的对象。
        * @param p 指向要删除的TxrAlgoDlmImpl对象的指针。
        */
       extern "C" O_TXR_ALGO_DLM_V5_EXPORT void DeleteDlmObj(TxrAlgoDlmImpl* p);
} // namespace txr_algo_dlm

#endif // O_TXR_ALGO_DLM_V5_H